"""
Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果进程池还没有满，就会创建一个新的进程来执行请求。
如果池满，请求就会告知先等待，直到池中有进程结束，才会创建新的进程来执行这些请求。

- apply_async: 其作用是向进程池提交需要执行的函数及参数， 
               各个进程采用非阻塞（异步）的调用方式，即每个子进程只管运行自己的，不管其它进程是否已经完成。
               这是默认方式。
- close(): 关闭进程池，使其不再接受新的任务。
- terminate(): 结束工作进程，不在处理未处理的任务。
- join(): 主进程阻塞等待子进程的退出， join方法要在close或terminate之后使用。
"""

from multiprocessing import Pool, cpu_count
import os
import time

def long_time_task(i):
    print('子进程: {} - 任务{}'.format(os.getpid(), i))
    time.sleep(2)
    print("结果: {}".format(8 ** 20))

if __name__=='__main__':
    print("CPU内核数:{}".format(cpu_count()))
    print('当前母进程: {}'.format(os.getpid()))
    start = time.time()
    p = Pool(4)
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print('等待所有子进程完成。')
    p.close()
    p.join()
    end = time.time()
    print("总共用时{}秒".format((end - start)))